package inmobiliaria.frsf.action;

import inmobiliaria.frsf.bo.ColeccionesComunesBO;
import inmobiliaria.frsf.bo.InmuebleBO;
import inmobiliaria.frsf.bo.impl.ColeccionesComunesBOImpl;
import inmobiliaria.frsf.bo.impl.InmuebleBOImpl;
import inmobiliaria.frsf.enums.EstadoInmuebleEnum;
import inmobiliaria.frsf.enums.TipoInmuebleEnum;
import inmobiliaria.frsf.model.Calle;
import inmobiliaria.frsf.model.Inmueble;
import inmobiliaria.frsf.model.Localidad;
import inmobiliaria.frsf.model.Persona;
import inmobiliaria.frsf.model.Provincia;
import inmobiliaria.frsf.model.Venta;
import inmobiliaria.frsf.reports.dto.ReporteInmuebleDTO;
import inmobiliaria.frsf.reports.dto.ReporteVentaDTO;
import inmobiliaria.frsf.reports.utils.GestionReporte;
import inmobiliaria.frsf.reports.utils.ReportData;
import inmobiliaria.frsf.util.DateUtils;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class CatalogoAction extends ActionSupport{

	/**
	 * 
	 */
	private static final long serialVersionUID = -6017281218471739206L;
	/**
	 * Constante para redirección.
	 */
	public static final String HOME = "home";
	public static final String CATALOGO = "catalogo";
	
	/**
	 * BO de inmueble
	 */
	private InmuebleBO inmuebleBO = new InmuebleBOImpl();

	/**
	 * Entidad de inmueble
	 */
	public Inmueble inmueble = new Inmueble();

	/**
	 * Lista de inmuebles
	 */
	public List<Inmueble> inmuebles = new ArrayList<Inmueble>();
	
	/**
	 * Lista de inmuebles seleccionados
	 */
	public List<Integer> selected = new ArrayList<Integer>();   

	/**
	 * Lista los tipos de inmueble
	 */
	public List<TipoInmuebleEnum> tiposInmueble = new ArrayList<TipoInmuebleEnum>();
	
	/**
	 * Lista con provincias
	 */
	public List<Provincia> provincias = new ArrayList<Provincia>();

	/**
	 * Lista con provincias
	 */
	public List<Localidad> localidades = new ArrayList<Localidad>();

	/**
	 * Lista con provincias
	 */
	public List<Calle> calles = new ArrayList<Calle>();

	/**
	 * Lista los estados de inmueble
	 */
	public List<EstadoInmuebleEnum> estadosInmueble = new ArrayList<EstadoInmuebleEnum>();
	
	/**
	 * Filtros grilla
	 */
	public String idTipoInmueble = "";
	public String idEstadoInmueble = "";
	public String barrio = "";
	public String ciudad = "";
	public String precioDesde = "";
	public String precioHasta = "";
	
	
	@Override
	public String execute() throws Exception {
		return abrirCatalogo();
	}

	public String abrirCatalogo() throws Exception {
		resetView();

		return CATALOGO;
	}	

	/**
	 * Realiza el filtrado de la grilla de propietarios.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String filtrarGrilla() throws Exception {
		resetView();
		
		return CATALOGO;
	}
	
	/**
	 * Genera el reporte de catalogo para los inmuebles seleccionados.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String generarReporte() throws Exception {
		resetView();
		
		ArrayList<Inmueble> inmueblesSeleccionados = new ArrayList<Inmueble>();
		
		for(Integer i : selected){			
			for(Inmueble inm : inmuebles){
				if(inm.getIdInmueble().equals(i)) {
					inmueblesSeleccionados.add(inm);
				}
			}
		}
		
		generarReporteInmueble(inmueblesSeleccionados);
		return CATALOGO;
	}

	/**
	 * Inicia los datos para la presentacion
	 */
	public void resetView() throws Exception {
		this.inmuebles = inmuebleBO.searchInmueble(null, idTipoInmueble, idEstadoInmueble, barrio, ciudad,
				precioDesde, precioHasta);
		this.tiposInmueble = TipoInmuebleEnum.getList();
		this.estadosInmueble = EstadoInmuebleEnum.getList();
		
		ServletActionContext.getRequest().setAttribute("totalResults", inmuebles.size());
		ServletActionContext.getRequest().setAttribute("pageSize", 5);
	}
	
	public String generarReporteInmueble(ArrayList<Inmueble> listaInmuebles) {

		try {
			Map<String, String> parameters = new HashMap<String, String>();
			List<ReporteInmuebleDTO> list = new ArrayList<ReporteInmuebleDTO>();
			
			for (Inmueble i : listaInmuebles){
				
				String nombrePropietario = i.getPropietario().getApellido() + " " +i.getPropietario().getNombre();
				ReporteInmuebleDTO ri = new ReporteInmuebleDTO();
				ri.setComprador("");
				ri.setEstado(i.getEstadoInmuebleString());
				ri.setIndice(String.valueOf(listaInmuebles.indexOf(i) + 1));
				ri.setPrecio(i.getPrecioVenta().toString());
				ri.setPropietario(nombrePropietario);
				ri.setTipo(i.getTipoInmuebleString());
				ri.setUbicacionGeografica(i.getUbicacionGeografica());
				ri.setDatosAdicionales(i.getStringDatos());
				list.add(ri);
			}
			
			Calendar fecha = Calendar.getInstance();
			String fechaReporte = DateUtils.getFechaEnLetras(fecha);
			String ciudadReporte = "";
			String barrioReporte = "";
			String tipoInmuebleReporte = "";
			String estadoInmuebleReporte = "";
			if(this.ciudad==null || this.ciudad.isEmpty())
				ciudadReporte = "Todas";
			else
				ciudadReporte = this.ciudad;
			if(this.barrio==null || this.barrio.isEmpty())
				barrioReporte = "Todos";
			else
				barrioReporte = this.barrio;
			
			tipoInmuebleReporte = this.idTipoInmueble.equals("-1")? "Todos" : TipoInmuebleEnum.getDescripcion(Integer.valueOf(this.idTipoInmueble));
			estadoInmuebleReporte = this.idEstadoInmueble.equals("-1")? "Todos" : EstadoInmuebleEnum.getDescripcion(Integer.valueOf(this.idEstadoInmueble));
			
			parameters.put("fechaReporte", fechaReporte);
			parameters.put("localidad", ciudadReporte);
			parameters.put("estado", estadoInmuebleReporte);
			parameters.put("barrio", barrioReporte);
			parameters.put("tipoInmueble", tipoInmuebleReporte);
			parameters.put("precioDesde", this.precioDesde.isEmpty()?"-":this.precioDesde);
			parameters.put("precioHasta", this.precioHasta.isEmpty()?"-":this.precioHasta);

			ReportData reportData = new ReportData();
			reportData.setParameters(parameters);
			reportData.setDataSource(new JRBeanCollectionDataSource(list));
			reportData.setReportName("reporteInmueble.jasper");

			GestionReporte.generarReporte(reportData);

			return "OK";

		} catch (Exception e) {
			e.printStackTrace();
			return "ERROR";
		}

	}
	/**
	 * @return the estadosInmueble
	 */
	public List<EstadoInmuebleEnum> getEstadosInmueble() {
		return estadosInmueble;
	}

	/**
	 * @param estadosInmueble the estadosInmueble to set
	 */
	public void setEstadosInmueble(List<EstadoInmuebleEnum> estadosInmueble) {
		this.estadosInmueble = estadosInmueble;
	}
	
	public Inmueble getInmueble() {
		return inmueble;
	}


	public void setInmueble(Inmueble inmueble) {
		this.inmueble = inmueble;
	}


	public List<Inmueble> getInmuebles() {
		return inmuebles;
	}


	public void setInmuebles(List<Inmueble> inmuebles) {
		this.inmuebles = inmuebles;
	}

	public List<Integer> getSelected() {  
		 return selected;  
	}  
	
	public void setSelected(List<Integer> selected) {
		 this.selected = selected;    
	}  

	public List<TipoInmuebleEnum> getTiposInmueble() {
		return tiposInmueble;
	}


	public void setTiposInmueble(List<TipoInmuebleEnum> tiposInmueble) {
		this.tiposInmueble = tiposInmueble;
	}


	public String getIdTipoInmueble() {
		return idTipoInmueble;
	}


	public void setIdTipoInmueble(String idTipoInmueble) {
		this.idTipoInmueble = idTipoInmueble;
	}


	public String getIdEstadoInmueble() {
		return idEstadoInmueble;
	}


	public void setIdEstadoInmueble(String idEstadoInmueble) {
		this.idEstadoInmueble = idEstadoInmueble;
	}


	public String getBarrio() {
		return barrio;
	}


	public void setBarrio(String barrio) {
		this.barrio = barrio;
	}


	public String getCiudad() {
		return ciudad;
	}


	public void setCiudad(String ciudad) {
		this.ciudad = ciudad;
	}


	public String getPrecioDesde() {
		return precioDesde;
	}


	public void setPrecioDesde(String precioDesde) {
		this.precioDesde = precioDesde;
	}


	public String getPrecioHasta() {
		return precioHasta;
	}


	public void setPrecioHasta(String precioHasta) {
		this.precioHasta = precioHasta;
	}

	
}
